QTreeView 使用 QStandardItemModel

您所在的位置:网站首页 qt TreeNode QTreeView 使用 QStandardItemModel

QTreeView 使用 QStandardItemModel

2024-07-10 08:46| 来源: 网络整理| 查看: 265

QTreeView 使用 QStandardItemModel

@

目录QTreeView 使用 QStandardItemModel前言一、直接上图二、添加同级结点项1.思路2.实现二、添加子结点项1. 思路2. 实现三、结点项上移1. 思路2.实现四、结点项下移1. 思路2.代码五、结点升级1. 思路2.代码五、结点降级1. 思路2.代码五、删除结点1. 思路2.代码项目源码总结

前言

Qt 模型视图的讲解到处都是,就不废话了。直接说QTreeView使用QsStandardItemModel的基本用法

一、直接上图

在这里插入图片描述

二、添加同级结点项 1.思路

1. 通过QTreeView的currentIndex()函数,获取当前结点的索引 2. 通过QStandardItemModel的itemFromIndex()函数,获取当前结点 3. 通过QStandardItem的parent()函数,获取当前结点的父结点 4. 用父结点添加一个新结点

2.实现

代码如下:

// 实例化一个要添加的结点 QStandardItem* item = new QStandardItem(QStringLiteral("新结点")); // 当前结点的索引 auto curIndex = ui.treeView->currentIndex(); // 无效则直接添加顶级结点 if (!curIndex.isValid()) { pModel->appendRow(item); return; } // 当前结点 auto curItem = pModel->itemFromIndex(curIndex); // 当前结点的父结点 auto parentItem = curItem->parent(); // 如果当前结点的父结点为空则是顶级结点 if (!parentItem) { pModel->appendRow(item); } else { parentItem->appendRow(item); } // 设置添加的结点为当前结点 ui.treeView->setCurrentIndex(item->index()); 二、添加子结点项 1. 思路

1. 还是先获取当前结点的索引 2. 再获取当前结点 3. 当前结点直接添加一个子结点

2. 实现

代码如下:

// 当前结点的索引 auto curIndex = ui.treeView->currentIndex(); // 无效则不做处理 if (!curIndex.isValid()) { return; } // 实例化一个要添加的结点 QStandardItem* item = new QStandardItem(QStringLiteral("新结点")); // 当前结点 auto curItem = pModel->itemFromIndex(curIndex); // 添加到子结点 curItem->appendRow(item); // 设置添加的结点为当前结点 ui.treeView->setCurrentIndex(item->index()); 三、结点项上移 1. 思路

1. 还是先获取当前结点的索引 2. 再获取当前结点 3. 判断如果当前结点已经是最上面一行了,则不做处理 4. 获取父结点 5. 父结点先移除当前结点,再把移除的结点添加到当前结点-1的位置

2.实现

代码如下:

// 当前结点的索引 auto curIndex = ui.treeView->currentIndex(); // 无效则不做处理 if (!curIndex.isValid()) { return; } // 当前结点 auto curItem = pModel->itemFromIndex(curIndex); // 当前结点的行 int row = curItem->row(); // 如果当前结点是第0行则不做处理 if (row == 0) { return; } // 当前结点的父结点 auto parentItem = curItem->parent(); // 如果父结点无效,则当前结点是顶级结点 if (!parentItem) { // 用model直接操作 // 先移除当前结点,再添加到当前结点索引-1的位置 pModel->insertRow(row - 1, pModel->takeRow(row)); } else { // 用父结点操作 parentItem->insertRow(row - 1, parentItem->takeRow(row)); } // 设置当前结点 ui.treeView->setCurrentIndex(curItem->index()); 四、结点项下移 1. 思路

1. 和结点上移思路一样,只不过重新添加的位置是+1

2.代码

代码如下:

// 当前结点的索引 auto curIndex = ui.treeView->currentIndex(); // 无效则不做处理 if (!curIndex.isValid()) { return; } // 当前结点 auto curItem = pModel->itemFromIndex(curIndex); // 当前结点的行 int row = curItem->row(); // 当前结点的父结点 auto parentItem = curItem->parent(); // 如果父结点无效,则当前结点是顶级结点 if (!parentItem) { // 用model直接操作 // 如果当前结点是最后一行则不做处理 if (row == pModel->rowCount() - 1) { return; } // 先移除当前结点,再添加到当前结点索引-1的位置 pModel->insertRow(row + 1, pModel->takeRow(row)); } else { // 如果当前结点是最后一行则不做处理 if (row == parentItem->rowCount() - 1) { return; } // 用父结点操作 parentItem->insertRow(row + 1, parentItem->takeRow(row)); } // 设置当前结点 ui.treeView->setCurrentIndex(curItem->index()); 五、结点升级 1. 思路

1. 还是先获取当前结点 2. 再获取当前结点的父结点 3. 再获取父结点的父结点 4. 将当前结点从父结点移除 5. 将移除的结点添加到父结点的父结点

2.代码

代码如下:

// 当前结点的索引 auto curIndex = ui.treeView->currentIndex(); // 无效则不做处理 if (!curIndex.isValid()) { return; } // 当前结点 auto curItem = pModel->itemFromIndex(curIndex); // 当前结点的行 int row = curItem->row(); // 当前结点的父结点 auto parentItem = curItem->parent(); // 如果父结点无效,则当前结点是顶级结点,不能再升级了,不做处理 if (!parentItem) { return; } else { // 获取父结点的的父结点 auto parent = parentItem->parent(); // 如果父结点 的 父结点 无效 则父结点是顶级结点,直接用model操作 if (!parent) { // 从父结点移除,父结点的父结点添加(添加位置随意),当前结点则成为了原本父结点的兄弟结点 pModel->insertRow(parentItem->row(), parentItem->takeRow(curItem->row())); } else { parent->insertRow(parentItem->row(), parentItem->takeRow(curItem->row())); } // 设置当前结点 ui.treeView->setCurrentIndex(curItem->index()); } 五、结点降级 1. 思路

1. 获取当前结点 2. 获取当前结点兄弟结点 3. 将当前结点添加到兄弟结点

2.代码

代码如下:

// 当前结点的索引 auto curIndex = ui.treeView->currentIndex(); // 无效则不做处理 if (!curIndex.isValid()) { return; } // 当前结点 auto curItem = pModel->itemFromIndex(curIndex); // 当前结点的行 int row = curItem->row(); // 当前结点的父结点 auto parentItem = curItem->parent(); // 如果父结点无效,则当前结点是顶级结点,不能再升级了,不做处理 if (!parentItem) { return; } else { // 获取父结点的的父结点 auto parent = parentItem->parent(); // 如果父结点 的 父结点 无效 则父结点是顶级结点,直接用model操作 if (!parent) { // 从父结点移除,父结点的父结点添加(添加位置随意),当前结点则成为了原本父结点的兄弟结点 pModel->insertRow(parentItem->row(), parentItem->takeRow(curItem->row())); } else { parent->insertRow(parentItem->row(), parentItem->takeRow(curItem->row())); } // 设置当前结点 ui.treeView->setCurrentIndex(curItem->index()); } 五、删除结点 1. 思路

1. 获取当前结点的父结点 2. 通过父结点删除当前结点

2.代码

代码如下:

// 当前结点的索引 auto curIndex = ui.treeView->currentIndex(); // 无效则不做处理 if (!curIndex.isValid()) { return; } // 当前结点 auto curItem = pModel->itemFromIndex(curIndex); // 当前结点的父结点 auto parentItem = curItem->parent(); // 如果父结点无效,则当前结点是顶级结点,直接使用model操作 if (!parentItem) { pModel->takeRow(curItem->row()); } else { parentItem->takeRow(curItem->row()); } 项目源码

骗个分 https://download.csdn.net/download/ShiShiSoLo/19943087

总结

没有



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3